// // #include <iostream>
// // #include <pthread.h> //线程头文件
// // #include <unistd.h>  //sleep

// // #include <sys/types.h>

// // int _thread_n = 0;
// // int _main_n = 0;
// // void *Func(void *_string)
// // {
// //     while (true)
// //     {
// //         std::cout << "Func(char *_string)'num:" << _thread_n << (char *)_string << "My Pid is: " << getpid() << std::endl;
// //         _thread_n++;
// //         sleep(2);
// //     }

// //     return nullptr;
// // }

// // int main()
// // {

// //     pthread_t _pthread; //
// //     ::pthread_create(&_pthread, nullptr, Func, (void *)"hello world");
// //     // 这里编译和链接的时候 需要加上 -lpthre d

// //     while (true)
// //     {

// //         std::cout << "int main()'num:" << _main_n << "My Pid is: " << getpid() << std::endl;
// //         _main_n++;
// //         sleep(5);
// //     }
// //     return 0;
// // }

// // #include <pthread.h>
// // // Linux 内核内核没有线程的概念， 操作系统不会给我们提供线程接口 只会提供创建轻量级进程的接口
// // #include <cstring>
// // #include <string.h>
// // #include <iostream>

// // #include <unistd.h>

// // void *Func(void *_stat)
// // {
// //     std::string _string = static_cast<const char *>(_stat);
// //     while (true)
// //     {
// //         std::cout << "我是新线程，我的名字是" << getpid() << std::endl;
// //         std::cout << "主线程给我传递的信息是" << _string << std::endl;
// //         sleep(1);
// //     }

// //     return 0;
// // }

// // int main()
// // {

// //     pthread_t _pthread;
// //     int _pthreadnum = pthread_create(&_pthread, nullptr, Func, (void *)"hello world");

// //     if (_pthreadnum != 0)
// //     {
// //         std::cout << "线程创建失败！" << std::endl;

// //         return 1;
// //     }

// //     while (true)
// //     {
// //         std::cout << "我是主线程，我的名字是" << getpid() << std::endl;
// //         sleep(2);
// //     }

// //     return 0;
// // }

// #include <iostream>
// #include <cstring>
// #include <string>
// #include <thread>

// #include <sys/types.h>

// #include <unistd.h>
// // struct Mes
// // {
// //     void *_say;
// //     void *_name;
// // };
// // 创建求和总值
// int _sum = 0;

// //>>创建一个最基础的类
// class ThreadData
// {
// public:
//     // ThreadData(const std::string &_str, int num = 2)
//     //     : _name(_str),
//     //       _number(num)
//     // {
//     // }
//     ThreadData()
//     {
//     }

//     void Init(const std::string &_str, int num)
//     {
//         _name = _str;
//         _number = num;
//     }

//     void SetPthread(pthread_t pthread)
//     {
//         this->_pthread = pthread;
//     }

//     int Getnum()
//     {
//         return _number;
//     }

//     std::string Getname()
//     {
//         return _name;
//     }

//     pthread_t GetPth()
//     {
//         return _pthread;
//     }

//     void SetPth(const pthread_t &_pth)
//     {
//         _pthread = _pth;
//     }

// private:
//     std::string _name;
//     int _number;
//     pthread_t _pthread;
// };

// // >> 获得16禁止的函数
// std::string ToHex(const pthread_t &_tid)
// {
//     char _buffer[64];
//     snprintf(_buffer, sizeof(_buffer), "0x%lx", _tid);
//     return _buffer;
// }

// // >> 设置 函数用于线程操作
// void *Func(void *_stat)
// {
//     ThreadData *_data = static_cast<ThreadData *>(_stat);
//     while (true)
//     {
//         std::cout << "我的id是" << ToHex(pthread_self()) << std::endl;
//         std::cout << "我的名字是" << _data->Getname() << std::endl;
//         // std::cout << "我要传递的信息是" << _mes->_say << std::endl;
//         std::cout << "我的数字是" << _data->Getnum() << std::endl;
//         _sum += _data->Getnum();
//         sleep(2);
//         break;
//     }

//     return _data;
// }

// #define NUM 10

// int main()
// {

//     //>>初始化数据
//     ThreadData _threadarr[20];
//     for (int _i = 0; _i < NUM; _i++)
//     {
//         char _name[64];
//         snprintf(_name, sizeof(_name), "THE NAME OF THREAD IS %d!", _i + 1);
//         _threadarr[_i].Init(_name, _i + 1);
//     }

//     //>>创建多线程
//     for (int _i = 0; _i < NUM; _i++)
//     {
//         pthread_t _pthid;
//         pthread_create(&_pthid, nullptr, Func, &_threadarr[_i]);
//         _threadarr[_i].SetPth(_pthid);
//     }

//     for (int _i = 0; _i < NUM; _i++)
//     {
//         pthread_join(_threadarr[_i].GetPth(), nullptr);
//     }

//     std::cout << "求和结果是" << _sum << std::endl;

//     return 0;
// }

// // int main()
// // {
// //     // >> 创建变量
// //     // pthread_t _pthread;
// //     // ThreadData *_threadData = new ThreadData("Lsj", 22);
// //     // void *_return1 = nullptr; // 这个用来接受第一个线程的返回参数2
// //     // pthread_create(&_pthread, nullptr, Func, _threadData);

// //     // // >> 等待线程1
// //     // if (pthread_join(_pthread, &_return1) != 0)
// //     // {
// //     //     std::cout << "线程1等待失败！" << std::endl;
// //     // }
// //     // else
// //     //     std::cout << "等待成功输出对应返回值：" << (long)_return1 << std::endl;

// //     //>>主线程运行

// //     while (true)
// //     {
// //         std::cout << "我是主线程，我的名字是" << getpid() << std::endl;
// //         sleep(2);
// //     }

// //     return 0;
// // }

#include <iostream>
#include <cstring>
#include <string>
#include <thread>

#include <sys/types.h>

#include <unistd.h>

// int *_add = nullptr;
// void *Func1(void *_stat)
// {

//     std::string *_str = static_cast<std::string *>(_stat);

//     int _a = 10;
//     _add = &_a;
//     while (true)
//     {
//         std::cout << _str << "111 locol value：" << _a << std::endl;
//         sleep(1);
//     }
// }

// void *Func2(void *_stat)
// {
//     std::string *_str = static_cast<std::string *>(_stat);
//     while (true)
//     {
//         if (_add != nullptr)
//         {
//             std::cout << _str << "222 locol value：" << (*_add)++ << std::endl;
//         }
//         sleep(1);
//     }
// }

// int main()
// {
//     pthread_t _p1, _p2;
//     pthread_create(&_p1, nullptr, Func1, (void *)"hello I'm 1");
//     pthread_create(&_p2, nullptr, Func2, (void *)"hello I'm 1");

//     pthread_join(_p1, nullptr);
//     pthread_join(_p2, nullptr);

//     return 0;
// }

// void *Func(void *_stat)
// {
//     std::string *_str = static_cast<std::string *>(_stat);

//     while (true)
//     {
//         std::cout << _str << std::endl;
//         sleep(1);
//         break;
//     }

//     pthread_exit((void *)10);
//     // return 0; //新线程return 表示线程退出
//     // 但是任何地方只要调用 exit(1) 就是  表示进程退出
// }

// int main()
// {
//     pthread_t _p1, _p2;
//     void *_ret = nullptr;

//     pthread_create(&_p1, nullptr, Func, (void *)"hello I'm 1");
//     pthread_join(_p1, &_ret);

//     std::cout << (long)_ret << std::endl;

//     return 0; // 主线程结束 表示进程结束
// }
std::string ToHex(const pthread_t &_tid)
{
    char _buffer[64];
    snprintf(_buffer, sizeof(_buffer), "0x%lx", _tid);
    return _buffer;
}

void *Func(void *_stat)
{
    std::string _str = static_cast<const char *>(_stat);

    while (true)
    {
        std::cout << "the mes is" << _str << std::endl;
        std::cout << "子线程 id是" << ToHex(pthread_self()) << std::endl;
        sleep(2);
    }

    return nullptr;
}

int main()
{
    pthread_t _pthread;
    pthread_create(&_pthread, nullptr, Func, (void *)"hello I'm 1");

    //>>打印一下相关信息
    std::cout << "main:  " << ToHex(pthread_self()) << "_pthread= " << ToHex(_pthread) << std::endl;
    pthread_join(_pthread, nullptr);

    return 0;
}